#include <QtGui>
#include "groupControl.h"

GroupControl::GroupControl(QWidget *parent) : QWidget(parent) {

  russianCodec = QTextCodec::codecForName("UTF-8");
  QTextCodec::setCodecForTr(russianCodec);
  QTextCodec::setCodecForCStrings(russianCodec);

  QString toolTip;
 
//Создание группы изменяющихся переменных
  groupBox = new QGroupBox("Основные параметры лотка", this);
  groupBox->move(1, 5);
//   groupBox->move(10, 5);
  groupBox->resize(WGROUPBOX-1, HGROUPBOX-5);
//   groupBox->resize(WGROUPBOX-10, HGROUPBOX-5);

//Создание первой группы: Ширина лотка по дну (b)
  toolTip = "Ширина лотка по дну";

  bLabel = new QLabel("<b>b =</b>", groupBox);
  bLabel->move(GLEFTIDENT, GUPIDENT);
  bLabel->resize(30, 25);
  bLabel->setToolTip(toolTip);

  bSpinBox = new QDoubleSpinBox(groupBox);
  bSpinBox->move(GLEFTIDENT+bLabel->width(), GUPIDENT);
  bSpinBox->resize(60, 25);
  bSpinBox->setRange(DEFMINBSP, DEFMAXBSP);
  bSpinBox->setSingleStep(0.01);
  bSpinBox->setToolTip(toolTip);

  bSlider = new QSlider(Qt::Horizontal, groupBox);
  bSlider->move(GLEFTIDENT+GLEFTSPACE+bLabel->width(), GUPIDENT);
  bSlider->resize(groupBox->width()-GRIGHTSPACE-bLabel->width(), 25);
  bSlider->setRange(DEFMINBSL, DEFMAXBSL);
  bSlider->setToolTip(toolTip);

  setBDoubleValue(bSpinBox->value());

  connect(bSlider,  SIGNAL(valueChanged(int)), this, SLOT(getBDoubleValue(int)));
  connect(bSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setBDoubleValue(double)));
  connect(bSpinBox, SIGNAL(valueChanged(double)), this, SIGNAL(callCalcWithNewB(double)));

//Создание Второй группы: Высота наполнения лотка (h)
  toolTip = "Высота наполнения лотка";

  hLabel = new QLabel("<b>h =</b>", groupBox);
  hLabel->move(GLEFTIDENT, GUPIDENT+GUPNEXTELEM);
  hLabel->resize(30, 25);
  hLabel->setToolTip(toolTip);

  hSpinBox = new QDoubleSpinBox(groupBox);
  hSpinBox->move(GLEFTIDENT+hLabel->width(), GUPIDENT+GUPNEXTELEM);
  hSpinBox->resize(60, 25);
  hSpinBox->setRange(DEFMINHSP, DEFMAXHSP);
  hSpinBox->setSingleStep(0.01);
  hSpinBox->setToolTip(toolTip);

  hSlider = new QSlider(Qt::Horizontal, groupBox);
  hSlider->move(GLEFTIDENT+GLEFTSPACE+hLabel->width(), GUPIDENT+GUPNEXTELEM);
  hSlider->resize(groupBox->width()-GRIGHTSPACE-hLabel->width(), 25);
  hSlider->setRange(DEFMINHSL, DEFMAXHSL);
  hSlider->setToolTip(toolTip);

//Создание третьей группы: Расчетная высота наполнения лотка (hr)
  toolTip = "Расчетная высота наполнения лотка";

  hrLabel = new QLabel("<b>h<sub>r</sub> =</b>", groupBox);
  hrLabel->move(GLEFTIDENT, GUPIDENT+2*GUPNEXTELEM);
  hrLabel->resize(30, 25);
  hrLabel->setToolTip(toolTip);

  hrSpinBox = new QDoubleSpinBox(groupBox);
  hrSpinBox->move(GLEFTIDENT+hLabel->width(), GUPIDENT+2*GUPNEXTELEM);
  hrSpinBox->resize(60, 25);
  hrSpinBox->setRange(DEFMINHSP, DEFMAXHSP);
  hrSpinBox->setSingleStep(0.01);
  hrSpinBox->setToolTip(toolTip);

  hrSlider = new QSlider(Qt::Horizontal, groupBox);
  hrSlider->move(GLEFTIDENT+GLEFTSPACE+hLabel->width(), GUPIDENT+2*GUPNEXTELEM);
  hrSlider->resize(groupBox->width()-GRIGHTSPACE-hLabel->width(), 25);
  hrSlider->setRange(DEFMINHSL, DEFMAXHSL);
  hrSlider->setToolTip(toolTip);

  setHDoubleValue(hSpinBox->value());
  setHDoubleValue(hrSpinBox->value());

//Связи высот
  connect(hSlider,  SIGNAL(valueChanged(int)),    this, SLOT(getHDoubleValue(int)));
  connect(hSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setHDoubleValue(double)));
  connect(hSpinBox, SIGNAL(valueChanged(double)), this, SIGNAL(callCalcWithNewH(double)));

  connect(hrSlider,  SIGNAL(valueChanged(int)),    this, SLOT(getHRDoubleValue(int)));
  connect(hrSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setHRDoubleValue(double)));
  connect(hrSpinBox, SIGNAL(valueChanged(double)), this, SIGNAL(callCalcWithNewHR(double)));

//Создание четвертой группы: Угол наклона стенок
  toolTip = "Угол наклона стенок";

  QString strLabel;
  strLabel = "<b>";
  strLabel += QChar(945);
  strLabel += " =</b>";

  grLabel  = new QLabel(strLabel, groupBox);
  grLabel->move(GLEFTIDENT, GUPIDENT+3*GUPNEXTELEM);
  grLabel->resize(30, 25);
  grLabel->setToolTip(toolTip);

  grSpinBox = new QSpinBox(groupBox);
  grSpinBox->move(GLEFTIDENT+grLabel->width(), GUPIDENT+3*GUPNEXTELEM);
  grSpinBox->resize(60, 25);
  grSpinBox->setRange(DEFMINASP, DEFMAXASP);
  grSpinBox->setToolTip(toolTip);

  grSlider = new QSlider(Qt::Horizontal, groupBox);
  grSlider->move(GLEFTIDENT+GLEFTSPACE+grLabel->width(), GUPIDENT+3*GUPNEXTELEM);
  grSlider->resize(groupBox->width()-GRIGHTSPACE-hLabel->width(), 25);
  grSlider->setRange(DEFMINASL, DEFMAXASL);
  grSlider->setSliderPosition(grSpinBox->value());
  grSlider->setToolTip(toolTip);

  connect(grSlider,  SIGNAL(valueChanged(int)), grSpinBox, SLOT(setValue(int)));
  connect(grSpinBox, SIGNAL(valueChanged(int)), grSlider, SLOT(setValue(int)));
  connect(grSpinBox, SIGNAL(valueChanged(int)), this, SIGNAL(callCalcWithNewAngle(int)));

  connect(grSlider,  SIGNAL(valueChanged(int)), this, SLOT(mesChangeGr(int)));
  connect(grSpinBox, SIGNAL(valueChanged(int)), this, SLOT(mesChangeGr(int)));

} //GroupControl::GroupControl(QWidget *parent) : QWidget(parent)

void GroupControl::getBDoubleValue(int val) {

  double dVal = double(val)/100;
  bSpinBox->setValue(dVal);

  QString str("<b>b =</b> ");
  str += QString().setNum(dVal);
  str += " <i>м</i>";

  emit callUpdateStatus(str);

} //void GroupControl::getBDoubleValue(int val)

void GroupControl::setBDoubleValue(double dVal) {

  int val = rint(dVal*100);
  bSlider->setSliderPosition(val);

  QString str("<b>b =</b> ");
  str += QString().setNum(dVal);
  str += " <i>м</i>";

  emit callUpdateStatus(str);

} //void GroupControl::setBDoubleValue(double val)

void GroupControl::getHDoubleValue(int val) {

  double dVal = double(val)/100;
  hSpinBox->setValue(dVal);

  //Уведомление
  QString str;
  str = "<b>h =</b> ";
  str += QString().setNum(dVal);
  str += " <i>м</i>";

  if (val < hrSlider->sliderPosition())
    hrSlider->setSliderPosition(hSlider->sliderPosition());

  emit callUpdateStatus(str);

} //void GroupControl::getHDoubleValue(int val)

void GroupControl::setHDoubleValue(double dVal) {

  int val = rint(dVal*100);
  hSlider->setSliderPosition(val);

  //Уведомление
  QString str;
  str = "<b>h =</b> ";
  str += QString().setNum(dVal);
  str += " <i>м</i>";

  if (dVal < hrSpinBox->value())
    hrSpinBox->setValue(hSpinBox->value());

  emit callUpdateStatus(str);

} //void GroupControl::setHDoubleValue(double val)

void GroupControl::getHRDoubleValue(int val) {

  double dVal = double(val)/100;
  hrSpinBox->setValue(dVal);

  //Уведомление
  QString str;
  str = "<b>h<sub>r</sub> =</b> ";
  str += QString().setNum(dVal);
  str += " <i>м</i>";

  emit callCalcWithNewHR(dVal);

  if (val > hSlider->sliderPosition())
    hSlider->setSliderPosition(hrSlider->sliderPosition());

  emit callUpdateStatus(str);

} //void GroupControl::getHRDoubleValue(int val)

void GroupControl::setHRDoubleValue(double dVal) {

  int val = rint(dVal*100);
  hrSlider->setSliderPosition(val);

  //Уведомление
  QString str;
  str  = "<b>h<sub>r</sub> =</b> ";
  str += QString().setNum(dVal);
  str += " <i>м</i>"; 

  emit callCalcWithNewHR(dVal);

  if (dVal > hSpinBox->value())
    hSpinBox->setValue(hrSpinBox->value());

  emit callUpdateStatus(str);

} //void GroupControl::setHRDoubleValue(double val)

void GroupControl::mesChangeGr(int newVal) {

  QString str("<b>Угол =</b> ");
  str += QString().setNum(newVal);
  str += QChar(176);

  emit callUpdateStatus(str);

} //void GroupControl::mesSpChangeGr(int newVal)
